fn test_borrow() {
//    1. 同一作用域，特定数据最多只有一个可变借用（&mut T）。
//    2. 同一作用域，特定数据可有0个或多个不可变借用（&T），但不能有任何可变借用。
//    3. 借用在离开作用域后释放。
//    4. 在可变借用释放前不可访问源变量。（X） 这条不成立

    let mut x:Vec<i32> = vec!{1_i32,2,3};

    let ref1 = &mut x;
    let ref2 = &mut x;
    //ref1.push(5); -- error: second mutable borrow occurs here
    ref2.push(5);

    println!("{:?}", x);
}

fn test_lifetime() {
//    Lifetime(R) ⊆ ( Lifetime(X) ∩ Lifetime(Y) ∩ Lifetime(Z) ∩ Lifetime(...) )
    struct Person<'a> {
        age: &'a u8,
    }

    impl<'a> Person<'a> {
        fn print_age(&self) {//因为print_age的返回值为()，所以可以不用考虑lifetime.
            println!("person.age = {}", self.age)
        }
    }

    let x = 34;
    let person = Person{age:&x};
    person.print_age();
}

fn main() {
    test_borrow();
    test_lifetime();
}
